<?php
/**
 * 视图类
 * 用于渲染视图模板
 */

namespace core;

use core\Debug;  // 引入 Debug 类

class View {
    private $data = [];
    private $viewPath;

    public function __construct() {
        $this->viewPath = APP_VIEW_PATH;
    }

    public function assign($name, $value) {
        $this->data[$name] = $value;
    }

    public function display($template = '') {
        if (empty($template)) {
            // 获取当前控制器和方法
            $controller = Route::getController();
            $action = Route::getAction();
            $template = $controller . '/' . $action . '.php';
        }

        $templateFile = $this->viewPath . $template;

        if (file_exists($templateFile)) {
            // 使用 Debug::log() 代替 echo
            Debug::log('当前访问模板: ' . $templateFile . '<br>');
            // 将View实例传递到视图作用域
            $this->data['view'] = $this;
            // 提取数据到当前作用域
            extract($this->data);
            // 加载模板文件
            include $templateFile;
        } else {
            // 使用 Debug::error() 代替 echo
            Debug::error('Template not found: ' . $templateFile);
        }
    }

    public function redirect($url) {
        header('Location: ' . $url);
        exit;
    }

    public function render($view, $data = []) {
        // 遍历数据数组，将每个键值对分配到视图
        foreach ($data as $key => $value) {
            $this->assign($key, $value);
        }
    
        // 如果只提供了文件名（不包含路径），自动添加当前控制器名称作为路径
        if (strpos($view, '/') === false && strpos($view, '\\') === false) {
            // 获取当前应用名称
            $appName = Route::getAppName();
            $controller = Route::getController();
            // 将控制器名称中的"Controller"后缀移除
            $controller = str_replace('Controller', '', $controller);
            // 构建视图路径：应用名称/视图/控制器名称/视图文件
            $view = $appName . '/view/' . $controller . '/' . $view;
        }
    
        // 显示视图
        $this->display($view);
    }

    public function includePublic($template) {
        $publicTemplate = $this->viewPath . 'public/' . $template;
        if (file_exists($publicTemplate)) {
            include $publicTemplate;
        } else {
            Debug::error('Public template not found: ' . $publicTemplate);
        }
    }

    public function includeView($view)
    {
        // 检查视图是否存在
        $viewFile = $this->viewPath . $view . '.php';
        if (file_exists($viewFile)) {
            // 提取当前数据到视图作用域
            extract($this->data);
            // 加载视图文件
            include $viewFile;
        } else {
            Debug::error('View not found: ' . $viewFile);
        }
    }

    /**
     * 转义HTML特殊字符
     * @param string $string 需要转义的字符串
     * @param int $flags 转义标志
     * @param string $encoding 编码方式
     * @return string 转义后的字符串
     */
    public function e($string, $flags = ENT_QUOTES | ENT_SUBSTITUTE, $encoding = 'UTF-8') {
        return htmlspecialchars($string, $flags, $encoding);
    }

    /**
     * 编码JSON数据
     * @param mixed $data 需要编码的数据
     * @return string 编码后的JSON字符串
     */
    public function json($data) {
        return json_encode($data, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT);
    }

    /**
     * 安全输出变量
     * @param mixed $var 要输出的变量
     * @param bool $escape 是否转义
     * @return void
     */
    public function output($var, $escape = true) {
        if ($escape) {
            if (is_array($var) || is_object($var)) {
                echo $this->json($var);
            } else {
                echo $this->e($var);
            }
        } else {
            if (is_array($var) || is_object($var)) {
                echo json_encode($var);
            } else {
                echo $var;
            }
        }
    }
}